﻿2026-05-10T12:00:19.4670500Z ##[group]Run pnpm verify:phase-5
2026-05-10T12:00:19.4670828Z [36;1mpnpm verify:phase-5[0m
2026-05-10T12:00:19.4692826Z shell: /usr/bin/bash -e {0}
2026-05-10T12:00:19.4693219Z env:
2026-05-10T12:00:19.4693847Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T12:00:19.4694345Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T12:00:19.4694750Z   SKIP_TRACE_CHECK: 1
2026-05-10T12:00:19.4695116Z ##[endgroup]
2026-05-10T12:00:19.7694126Z 
2026-05-10T12:00:19.7695057Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-10T12:00:19.7696131Z > node scripts/verify-phase-5.mjs
2026-05-10T12:00:19.7696683Z 
2026-05-10T12:00:19.8020603Z 
2026-05-10T12:00:19.8021413Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-10T12:00:19.8022408Z >>> pnpm verify:phase-4
2026-05-10T12:00:20.1784451Z 
2026-05-10T12:00:20.1785477Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T12:00:20.1786689Z > node scripts/verify-phase-4.mjs
2026-05-10T12:00:20.1787250Z 
2026-05-10T12:00:20.2092448Z 
2026-05-10T12:00:20.2094129Z === Workspace: typecheck ===
2026-05-10T12:00:20.2095064Z >>> pnpm -r typecheck
2026-05-10T12:00:20.5254677Z Scope: 5 of 6 workspace projects
2026-05-10T12:00:20.5335055Z packages/db typecheck$ tsc --noEmit
2026-05-10T12:00:20.5347387Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T12:00:23.1244660Z packages/game-logic typecheck: Done
2026-05-10T12:00:23.1278294Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T12:00:25.2689415Z packages/db typecheck: Done
2026-05-10T12:00:26.6307851Z packages/protocol typecheck: Done
2026-05-10T12:00:26.6315172Z apps/client typecheck$ tsc --noEmit
2026-05-10T12:00:26.6318258Z apps/server typecheck$ tsc --noEmit
2026-05-10T12:00:37.1405397Z apps/client typecheck: Done
2026-05-10T12:00:38.5559825Z apps/server typecheck: Done
2026-05-10T12:00:38.5649586Z 
2026-05-10T12:00:38.5650142Z === Lint: protocol-sync ===
2026-05-10T12:00:38.5650849Z >>> pnpm lint:protocol-sync
2026-05-10T12:00:38.8698217Z 
2026-05-10T12:00:38.8699169Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T12:00:38.8700503Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T12:00:38.8701209Z 
2026-05-10T12:00:38.8996800Z lint-protocol-sync: OK
2026-05-10T12:00:38.9114074Z 
2026-05-10T12:00:38.9114718Z === Lint: game-logic-purity ===
2026-05-10T12:00:38.9115638Z >>> pnpm lint:game-logic-purity
2026-05-10T12:00:39.2145483Z 
2026-05-10T12:00:39.2146586Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T12:00:39.2147879Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T12:00:39.2148681Z 
2026-05-10T12:00:39.2457533Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T12:00:39.2568850Z 
2026-05-10T12:00:39.2569517Z === Lint: better-auth-schema-sync ===
2026-05-10T12:00:39.2570432Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T12:00:39.5639837Z 
2026-05-10T12:00:39.5640968Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:00:39.5642484Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T12:00:39.5643232Z 
2026-05-10T12:00:41.0591112Z lint-better-auth-schema-sync: OK
2026-05-10T12:00:41.0725510Z 
2026-05-10T12:00:41.0726365Z === Lint: rate-limit-budgets ===
2026-05-10T12:00:41.0727175Z >>> pnpm lint:rate-limit-budgets
2026-05-10T12:00:41.3808133Z 
2026-05-10T12:00:41.3808776Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T12:00:41.3809685Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T12:00:41.3809923Z 
2026-05-10T12:00:41.4104251Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T12:00:41.4226319Z 
2026-05-10T12:00:41.4227003Z === Lint: no-clipboard-rce ===
2026-05-10T12:00:41.4227829Z >>> pnpm lint:no-clipboard-rce
2026-05-10T12:00:41.7311296Z 
2026-05-10T12:00:41.7312387Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T12:00:41.7313970Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T12:00:41.7314696Z 
2026-05-10T12:00:41.7679013Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T12:00:41.7798375Z 
2026-05-10T12:00:41.7798875Z === Lint: room-layout ===
2026-05-10T12:00:41.7799790Z >>> pnpm lint:room-layout
2026-05-10T12:00:42.0852303Z 
2026-05-10T12:00:42.0853343Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T12:00:42.0854893Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T12:00:42.0855490Z 
2026-05-10T12:00:42.1209103Z lint-room-layout: OK
2026-05-10T12:00:42.1336422Z 
2026-05-10T12:00:42.1337038Z === ADR 0004 lint ===
2026-05-10T12:00:42.1337778Z >>> pnpm lint:adr:0004
2026-05-10T12:00:42.4423329Z 
2026-05-10T12:00:42.4424529Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T12:00:42.4426053Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T12:00:42.4429150Z 
2026-05-10T12:00:42.4722745Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:00:42.4844199Z 
2026-05-10T12:00:42.4844901Z === Drizzle: emit-check ===
2026-05-10T12:00:42.4845738Z >>> pnpm db:emit-check
2026-05-10T12:00:42.7865940Z 
2026-05-10T12:00:42.7867202Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T12:00:42.7871703Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T12:00:42.7874156Z 
2026-05-10T12:00:43.2408568Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T12:00:43.2411445Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T12:00:43.6089305Z 8 tables
2026-05-10T12:00:43.6090109Z accounts 8 columns 1 indexes 0 fks
2026-05-10T12:00:43.6091056Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T12:00:43.6091995Z characters 9 columns 0 indexes 1 fks
2026-05-10T12:00:43.6092900Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T12:00:43.6094165Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T12:00:43.6095032Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T12:00:43.6095934Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T12:00:43.6096824Z sessions 5 columns 0 indexes 1 fks
2026-05-10T12:00:43.6097381Z 
2026-05-10T12:00:43.6098232Z No schema changes, nothing to migrate 😴
2026-05-10T12:00:43.7137722Z 
2026-05-10T12:00:43.7138508Z === Drizzle: schema-sync ===
2026-05-10T12:00:43.7139337Z >>> pnpm lint:schema-sync
2026-05-10T12:00:44.0188859Z 
2026-05-10T12:00:44.0189864Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T12:00:44.0193914Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T12:00:44.0196557Z 
2026-05-10T12:00:44.0461519Z OK
2026-05-10T12:00:44.0579596Z 
2026-05-10T12:00:44.0580139Z === Drizzle: source-comments ===
2026-05-10T12:00:44.0581014Z >>> pnpm lint:source-comments
2026-05-10T12:00:44.3841920Z 
2026-05-10T12:00:44.3842944Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T12:00:44.3844569Z > pnpm -C packages/db run lint:source-comments
2026-05-10T12:00:44.3845826Z 
2026-05-10T12:00:44.6931546Z 
2026-05-10T12:00:44.6932677Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T12:00:44.6934253Z > node scripts/check-source-comments.mjs
2026-05-10T12:00:44.6934933Z 
2026-05-10T12:00:44.7431904Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T12:00:44.7642919Z 
2026-05-10T12:00:44.7644512Z === Workspace: test ===
2026-05-10T12:00:44.7644994Z >>> pnpm -r test
2026-05-10T12:00:45.0732095Z Scope: 5 of 6 workspace projects
2026-05-10T12:00:45.0790169Z packages/db test$ vitest run
2026-05-10T12:00:45.0799677Z packages/game-logic test$ vitest run
2026-05-10T12:00:45.6025790Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T12:00:45.6053075Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T12:00:45.9255725Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-10T12:00:46.2085532Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:00:46.4385435Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:00:46.5968947Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:00:46.6745818Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:00:46.6814172Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:00:46.6836157Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T12:00:46.6844737Z packages/game-logic test: [2m   Start at [22m 12:00:45
2026-05-10T12:00:46.6855106Z packages/game-logic test: [2m   Duration [22m 1.07s[2m (transform 123ms, setup 0ms, import 224ms, tests 46ms, environment 1ms)[22m
2026-05-10T12:00:46.7264766Z packages/game-logic test: Done
2026-05-10T12:00:46.7273013Z packages/protocol test$ vitest run
2026-05-10T12:00:47.2425807Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T12:00:47.4460238Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:00:47.6691726Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T12:00:47.7196125Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:00:47.7355238Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T12:00:47.7358330Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T12:00:47.7374479Z packages/db test: [2m   Start at [22m 12:00:45
2026-05-10T12:00:47.7395228Z packages/db test: [2m   Duration [22m 2.12s[2m (transform 185ms, setup 0ms, import 1.45s, tests 30ms, environment 0ms)[22m
2026-05-10T12:00:47.7603399Z packages/db test: Done
2026-05-10T12:00:47.8665785Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:00:48.0355535Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:00:48.1865683Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:00:48.2058425Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:00:48.2163314Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T12:00:48.2174900Z packages/protocol test: [2m   Start at [22m 12:00:47
2026-05-10T12:00:48.2177202Z packages/protocol test: [2m   Duration [22m 948ms[2m (transform 137ms, setup 0ms, import 273ms, tests 39ms, environment 0ms)[22m
2026-05-10T12:00:48.2279262Z packages/protocol test: Done
2026-05-10T12:00:48.2285791Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T12:00:48.2288456Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T12:00:48.8135963Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T12:00:48.8314157Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T12:00:49.8145665Z apps/server test: {"level":30,"time":1778414449809,"pid":4360,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T12:00:49.8205022Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 719[2mms[22m[39m
2026-05-10T12:00:49.8244970Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 598[2mms[22m[39m
2026-05-10T12:00:50.4710904Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T12:00:50.4735076Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T12:00:50.4824138Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 149[2mms[22m[39m
2026-05-10T12:00:50.9925497Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 55[2mms[22m[39m
2026-05-10T12:00:51.7537233Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 135[2mms[22m[39m
2026-05-10T12:00:51.9016702Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T12:00:51.9054894Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ArQI8Z/rebno.db
2026-05-10T12:00:51.9083294Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:00:51.9101396Z apps/server test: [run-migrations] OK
2026-05-10T12:00:51.9223238Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T12:00:51.9236421Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-GIKAuz/rebno.db
2026-05-10T12:00:51.9240103Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:00:51.9242848Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T12:00:51.9244537Z apps/server test: [run-migrations] OK
2026-05-10T12:00:51.9325673Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:00:51.9344859Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Rj9qIx/rebno.db
2026-05-10T12:00:51.9365295Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:00:51.9367539Z apps/server test: [run-migrations] OK
2026-05-10T12:00:51.9370141Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:00:51.9373919Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-Rj9qIx/rebno.db
2026-05-10T12:00:51.9376086Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:00:51.9377330Z apps/server test: [run-migrations] OK
2026-05-10T12:00:51.9458817Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 64[2mms[22m[39m
2026-05-10T12:00:52.2640713Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-10T12:00:52.5231335Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:00:52.7864946Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T12:00:53.0427452Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:00:53.0450377Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 115[2mms[22m[39m
2026-05-10T12:00:53.3875492Z apps/server test: {"level":40,"time":1778414453380,"pid":4478,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:00:53.3963854Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-10T12:00:53.3976865Z apps/server test: {"level":40,"time":1778414453388,"pid":4478,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:00:53.4024925Z apps/server test: {"level":40,"time":1778414453388,"pid":4478,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:00:54.2425330Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T12:00:54.2455290Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ secrets for agents [www.dotenvx.com]
2026-05-10T12:00:54.2474584Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T12:00:54.2636509Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 123[2mms[22m[39m
2026-05-10T12:00:55.0360021Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:00:55.2866416Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:00:55.4373237Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 39[2mms[22m[39m
2026-05-10T12:00:55.5379822Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:00:55.5424989Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T12:00:55.5437647Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T12:00:55.5479723Z apps/server test: [2m   Start at [22m 12:00:48
2026-05-10T12:00:55.5485292Z apps/server test: [2m   Duration [22m 6.74s[2m (transform 439ms, setup 0ms, import 3.37s, tests 956ms, environment 2ms)[22m
2026-05-10T12:00:55.5972099Z apps/server test: Done
2026-05-10T12:00:56.1807341Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:00:56.9992908Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 33[2mms[22m[39m
2026-05-10T12:00:57.6797555Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T12:00:58.3618306Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:00:59.0279247Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:00:59.6956505Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:01:00.3947678Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:01:01.0699454Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:01:01.7375804Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:01:02.4001977Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:01:03.0807169Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:01:03.1022862Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T12:01:03.1035145Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T12:01:03.1045153Z apps/client test: [2m   Start at [22m 12:00:48
2026-05-10T12:01:03.1065231Z apps/client test: [2m   Duration [22m 14.27s[2m (transform 535ms, setup 44ms, collect 835ms, tests 667ms, environment 8.37s, prepare 1.59s)[22m
2026-05-10T12:01:03.2348333Z apps/client test: Done
2026-05-10T12:01:03.2420446Z 
2026-05-10T12:01:03.2421300Z verify-phase-4: OK (12 steps green)
2026-05-10T12:01:03.2530751Z 
2026-05-10T12:01:03.2533174Z === Workspace: typecheck ===
2026-05-10T12:01:03.2534023Z >>> pnpm -r typecheck
2026-05-10T12:01:03.5627765Z Scope: 5 of 6 workspace projects
2026-05-10T12:01:03.5683415Z packages/db typecheck$ tsc --noEmit
2026-05-10T12:01:03.5692065Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T12:01:06.0914795Z packages/game-logic typecheck: Done
2026-05-10T12:01:06.0938913Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T12:01:08.4914637Z packages/db typecheck: Done
2026-05-10T12:01:09.5877555Z packages/protocol typecheck: Done
2026-05-10T12:01:09.5884360Z apps/client typecheck$ tsc --noEmit
2026-05-10T12:01:09.5887096Z apps/server typecheck$ tsc --noEmit
2026-05-10T12:01:20.2794685Z apps/client typecheck: Done
2026-05-10T12:01:21.5382505Z apps/server typecheck: Done
2026-05-10T12:01:21.5484175Z 
2026-05-10T12:01:21.5484738Z === Lint: deploy-stack ===
2026-05-10T12:01:21.5485427Z >>> pnpm lint:deploy-stack
2026-05-10T12:01:21.8522277Z 
2026-05-10T12:01:21.8523412Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-10T12:01:21.8524908Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-10T12:01:21.8525534Z 
2026-05-10T12:01:21.8825189Z lint-deploy-stack: OK
2026-05-10T12:01:21.8948790Z 
2026-05-10T12:01:21.8949500Z === Lint: deploy-stack test ===
2026-05-10T12:01:21.8950533Z >>> pnpm lint:deploy-stack:test
2026-05-10T12:01:22.2074805Z 
2026-05-10T12:01:22.2075883Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-10T12:01:22.2077380Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-10T12:01:22.2077994Z 
2026-05-10T12:01:22.2682205Z PASS: lint-deploy-stack green
2026-05-10T12:01:22.2812152Z 
2026-05-10T12:01:22.2812691Z === ADR 0005 lint ===
2026-05-10T12:01:22.2813387Z >>> pnpm lint:adr:0005
2026-05-10T12:01:22.5861497Z 
2026-05-10T12:01:22.5862444Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-10T12:01:22.5864143Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-10T12:01:22.5865150Z 
2026-05-10T12:01:22.6175107Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:01:22.6294184Z 
2026-05-10T12:01:22.6294679Z === ADR 0006 lint ===
2026-05-10T12:01:22.6295402Z >>> pnpm lint:adr:0006
2026-05-10T12:01:22.9364157Z 
2026-05-10T12:01:22.9365440Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-10T12:01:22.9367001Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-10T12:01:22.9367914Z 
2026-05-10T12:01:22.9664333Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T12:01:22.9784485Z 
2026-05-10T12:01:22.9785116Z === Workspace: test ===
2026-05-10T12:01:22.9786247Z >>> pnpm -r test
2026-05-10T12:01:23.2885375Z Scope: 5 of 6 workspace projects
2026-05-10T12:01:23.2941009Z packages/db test$ vitest run
2026-05-10T12:01:23.2950153Z packages/game-logic test$ vitest run
2026-05-10T12:01:23.8007683Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T12:01:23.8035370Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T12:01:24.1235483Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-10T12:01:24.4082315Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:01:24.6421126Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:01:24.8484032Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:01:24.8631048Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:01:24.8749844Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:01:24.8775212Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T12:01:24.8783146Z packages/game-logic test: [2m   Start at [22m 12:01:23
2026-05-10T12:01:24.8788707Z packages/game-logic test: [2m   Duration [22m 1.07s[2m (transform 130ms, setup 0ms, import 213ms, tests 44ms, environment 1ms)[22m
2026-05-10T12:01:24.9168044Z packages/game-logic test: Done
2026-05-10T12:01:24.9184612Z packages/protocol test$ vitest run
2026-05-10T12:01:25.4345221Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T12:01:25.7595674Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:01:25.8706321Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T12:01:26.0102559Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:01:26.0163371Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T12:01:26.0184741Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T12:01:26.0195935Z packages/db test: [2m   Start at [22m 12:01:23
2026-05-10T12:01:26.0223765Z packages/db test: [2m   Duration [22m 2.21s[2m (transform 181ms, setup 0ms, import 1.54s, tests 31ms, environment 1ms)[22m
2026-05-10T12:01:26.0465521Z packages/db test: Done
2026-05-10T12:01:26.1067927Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:01:26.3031073Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:01:26.4568292Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:01:26.4605007Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T12:01:26.4606528Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T12:01:26.4607520Z packages/protocol test: [2m   Start at [22m 12:01:25
2026-05-10T12:01:26.4608638Z packages/protocol test: [2m   Duration [22m 1.02s[2m (transform 149ms, setup 0ms, import 296ms, tests 39ms, environment 1ms)[22m
2026-05-10T12:01:26.4925751Z packages/protocol test: Done
2026-05-10T12:01:26.4944617Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T12:01:26.4945924Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T12:01:27.0495767Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T12:01:27.0945501Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T12:01:28.1474087Z apps/server test: {"level":30,"time":1778414488144,"pid":5220,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T12:01:28.1498089Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 763[2mms[22m[39m
2026-05-10T12:01:28.1521128Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 598[2mms[22m[39m
2026-05-10T12:01:28.7396819Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T12:01:28.7402369Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T12:01:28.7626225Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 153[2mms[22m[39m
2026-05-10T12:01:29.2049879Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T12:01:29.2052445Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-9tIqqx/rebno.db
2026-05-10T12:01:29.2056807Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:01:29.2084633Z apps/server test: [run-migrations] OK
2026-05-10T12:01:29.2133781Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T12:01:29.2136218Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-k1xHkq/rebno.db
2026-05-10T12:01:29.2141980Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:01:29.2146351Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T12:01:29.2186788Z apps/server test: [run-migrations] OK
2026-05-10T12:01:29.2189131Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:01:29.2192016Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-1QkOnA/rebno.db
2026-05-10T12:01:29.2194205Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:01:29.2201926Z apps/server test: [run-migrations] OK
2026-05-10T12:01:29.2204624Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T12:01:29.2212924Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-1QkOnA/rebno.db
2026-05-10T12:01:29.2215278Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T12:01:29.2217034Z apps/server test: [run-migrations] OK
2026-05-10T12:01:29.2218800Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 52[2mms[22m[39m
2026-05-10T12:01:29.9399445Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 132[2mms[22m[39m
2026-05-10T12:01:30.3318208Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 82[2mms[22m[39m
2026-05-10T12:01:30.6318588Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 27[2mms[22m[39m
2026-05-10T12:01:30.8907716Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-10T12:01:31.1362296Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 140[2mms[22m[39m
2026-05-10T12:01:31.1824087Z apps/server test: {"level":40,"time":1778414491168,"pid":5326,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:01:31.2085716Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-10T12:01:31.2294603Z apps/server test: {"level":40,"time":1778414491171,"pid":5326,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:01:31.2305116Z apps/server test: {"level":40,"time":1778414491172,"pid":5326,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T12:01:31.5162958Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-10T12:01:31.7653729Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:01:32.0185598Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:01:32.3112939Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 109[2mms[22m[39m
2026-05-10T12:01:32.9284705Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T12:01:32.9325367Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ enable debugging { debug: true }
2026-05-10T12:01:32.9384690Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T12:01:33.4820721Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 37[2mms[22m[39m
2026-05-10T12:01:33.7161493Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:01:34.0388211Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-10T12:01:34.0495003Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T12:01:34.0504942Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T12:01:34.0514426Z apps/server test: [2m   Start at [22m 12:01:27
2026-05-10T12:01:34.0533140Z apps/server test: [2m   Duration [22m 6.98s[2m (transform 477ms, setup 0ms, import 3.49s, tests 1.03s, environment 6ms)[22m
2026-05-10T12:01:34.0830994Z apps/server test: Done
2026-05-10T12:01:34.4918411Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T12:01:35.1872589Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-10T12:01:35.8810853Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T12:01:36.5522209Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T12:01:37.2210698Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T12:01:37.8899268Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T12:01:38.5935814Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T12:01:39.2792048Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:01:39.9464608Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:01:40.6192225Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T12:01:41.2867146Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T12:01:41.3065674Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T12:01:41.3079047Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T12:01:41.3085412Z apps/client test: [2m   Start at [22m 12:01:27
2026-05-10T12:01:41.3087378Z apps/client test: [2m   Duration [22m 14.21s[2m (transform 533ms, setup 57ms, collect 844ms, tests 656ms, environment 8.21s, prepare 1.63s)[22m
2026-05-10T12:01:41.4415160Z apps/client test: Done
2026-05-10T12:01:41.4499949Z 
2026-05-10T12:01:41.4502007Z verify-phase-5: OK (7 steps green)
